#include "cabecera.h"

struct contenedor* nuevoElemento(){
	return ((struct contenedor*) malloc(sizeof(struct contenedor)));
}

int cuentaContenedores(struct contenedor** cabeza){
	struct contenedor* aux = NULL;
	int contador = 0, codigo;
	while(!estaVacia(*cabeza)){
		codigo = desapilar(cabeza);
		apilar(&aux, codigo);
		contador++;
	}
	while(!estaVacia(aux)){
		codigo = desapilar(&aux);
		apilar(cabeza, codigo);
	}

	return contador;
}

void apilar(struct contenedor** cabeza, int codigo){
	struct contenedor* nuevo = NULL;

	nuevo = nuevoElemento();
	(*nuevo).codigo = codigo;

	(*nuevo).siguiente = *cabeza;
	*cabeza = nuevo;
}

int desapilar(struct contenedor** cabeza){
	struct contenedor* aux = NULL;
	int codigo;
	aux = *cabeza;
	*cabeza = (*aux).siguiente;
	codigo = (*aux).codigo;
	free(aux);

	return codigo;
}

int verCima(struct contenedor* cabeza){
	int codigo; 
	codigo = (*cabeza).codigo;
	return codigo;
}


int buscarContenedor(struct contenedor** cabeza, int codigo){
	int encontrado = 0, codaux, auxi;
	struct contenedor* aux = NULL;
	while(encontrado == 0 && !estaVacia(*cabeza)){
		auxi = verCima(*cabeza);
		if(auxi == codigo){
			encontrado = 1;
		}
		else{
			codaux = desapilar(cabeza);
			apilar(&aux, codaux);			
		}

	}
	while(!estaVacia(aux)){
		codaux = desapilar(&aux);
		apilar(cabeza, codaux);
	}

	return encontrado;


}
void muestraContenedores(struct contenedor** cabeza){
	struct contenedor* aux = NULL;
	int i = 0, codigo;
	while(!estaVacia(*cabeza)){
		printf("CONTENEDOR [%d]\n", i);
		printf("Codigo: %d\n\n", (*(*cabeza)).codigo);
		codigo = desapilar(cabeza);
		apilar(&aux, codigo);
		i++;
	}
	while(!estaVacia(aux)){
		codigo = desapilar(&aux);
		apilar(cabeza, codigo);
	}
}

int estaVacia(struct contenedor* cabeza){
	if(cabeza == NULL){
		return 1;
	}
	return 0;
}

void sacaContenedor(struct contenedor** cabeza, int codigo){ // PRESUPONEMOS QUE HAY UN CONTENEDOR EN LA PILA CON ESE CODIGO
	struct contenedor* aux = NULL;
	int codaux;
	while((*(*cabeza)).codigo != codigo){
		codaux = desapilar(cabeza);
		apilar(&aux, codaux);
	}
	codaux = desapilar(cabeza);
	printf("Vamos a quitar el contenedor %d\n", codigo);
	while(!estaVacia(aux)){
		codaux = desapilar(&aux);
		apilar(cabeza, codaux);
	}
}
